package com.pe.pgn.clubpgn.service.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.PromocionBonoDao;
import com.pe.pgn.clubpgn.domain.ClpbPromocionBono;
import com.pe.pgn.clubpgn.domain.ClpdRangoPromocion;
import com.pe.pgn.clubpgn.domain.ClpdTipoBono;
import com.pe.pgn.clubpgn.domain.ClprPromocionEstacion;
import com.pe.pgn.clubpgn.domain.beans.BNPromocionBono;
import com.pe.pgn.clubpgn.domain.beans.BNPromocionEstacion;
import com.pe.pgn.clubpgn.service.PromocionBonoService;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

@Service("promocionBonoService")
public class PromocionBonoServiceImpl implements PromocionBonoService{

	@Autowired PromocionBonoDao promocionBonoDao;

	public List<ClpbPromocionBono> listarPromocionesBono(boolean addItemDefault) {
		return promocionBonoDao.listarPromocionesBono(addItemDefault);
	}

	public List<ClpbPromocionBono> buscarPromocionesBono(String dePromoBono,
			String iniVigencia, String finVigencia, String stPromoBono) {
		
		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, iniVigencia);
        }catch(Exception e){
        	iniVigencia = ""; //entra aca si el parametro dado no es una fecha
        }
        
        try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, finVigencia);
        }catch(Exception e){
        	finVigencia = ""; //entra aca si el parametro dado no es una fecha
        }
		
		return promocionBonoDao.buscarPromocionesBono(dePromoBono, iniVigencia, finVigencia, stPromoBono);
	}

	public ClpbPromocionBono obtenerPromocionBono(Long idPromocionBono) {
		return promocionBonoDao.obtenerPromocionBono(idPromocionBono);
	}

	public Map<String, Object> guardarPromocionBono(
			ClpbPromocionBono promocionBono) {
		
		Calendar calIni = null;
    	Calendar calFin = null;
		
		try{
        	calIni = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, promocionBono.getInicioVigencia());
        	calFin = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, promocionBono.getFinVigencia());
        }catch(Exception e){
        	calIni = null;
        	calFin = null;
        }
		
        ClpdTipoBono clpdTipoBono = new ClpdTipoBono();
        clpdTipoBono.setId(new Long(promocionBono.getCoTipoBono()));
        
        promocionBono.setDaInicioVigencia(calIni);
        promocionBono.setDaFinVigencia(calFin);
        promocionBono.setClpdTipoBono(clpdTipoBono);
        
        ////////////////////////////////////////////
        
        Map<String,Object> mapMsg = new HashMap<String, Object>();        
        boolean isDuplicatedDesc = promocionBonoDao.validarDuplicidadDesc(promocionBono);
		if(isDuplicatedDesc){
			
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			mapMsg.put("detalle", "promocion_duplicidad_desc");
			return mapMsg;
		}
		
		boolean isValidMonto = promocionBonoDao.validarMontoMinimo(promocionBono);
		if(!isValidMonto){
			
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			mapMsg.put("detalle", "promocion_validatemontomin");
			return mapMsg;
		}
		
		if(promocionBono.getDaInicioVigencia() != null && promocionBono.getDaFinVigencia() != null){
			boolean isValid = promocionBonoDao.validarTraslapePromoBono(promocionBono);
			if(!isValid){
				
				mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
				mapMsg.put("detalle", "promocion_traslape");
				return mapMsg;
			}
		}
		
		if(!promocionBono.isStPromocionBono() && promocionBono.getId() != null){
			boolean isValid = promocionBonoDao.validarNoUsanPromocionBono(promocionBono.getId());
			if(!isValid){
				
				mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
				mapMsg.put("detalle", "promocion_validacion.deshabilito");
				return mapMsg;
			}
		}
        
		return promocionBonoDao.guardarPromocionBono(promocionBono);
	}

	public Map<String,Object> eliminarPromocionBono(Long id) {
		
		Map<String,Object> map = new HashMap<String,Object>();
		int rows = promocionBonoDao.eliminarPromocionBono(id);
		map.put("rowsDeleted", rows);
		return map;
	}

	public boolean validarTraslapePromoBono(ClpbPromocionBono promocionBono) {
		return promocionBonoDao.validarTraslapePromoBono(promocionBono);
	}

	public boolean validarMontoMinimo(ClpbPromocionBono promocionBono) {
		return promocionBonoDao.validarMontoMinimo(promocionBono);
	}

	public boolean validarDuplicidadDesc(ClpbPromocionBono promocionBono) {
		return promocionBonoDao.validarDuplicidadDesc(promocionBono);
	}

	public List<ClpdRangoPromocion> listarRangoPromocion(Long id) {
		return promocionBonoDao.listarRangoPromocion(id);
	}

	public int eliminarRangos(Long idRangoPromocion) {
		return promocionBonoDao.eliminarRangos(idRangoPromocion);		
	}

	public Map<String, Object> guardarRangos(String idPromocionBono, String vaConsumoInicio,
			String vaConsumoFin, String vaCantidad, String stEsRangoFinal) {
		
		Map<String, Object> mapMsg = new HashMap<String, Object>();
		
		//validaciones en el caso de rango final
		if(stEsRangoFinal.equalsIgnoreCase("true")){
			boolean existeRangoFinal = promocionBonoDao.existeRangoFinal(idPromocionBono);
			
			if(existeRangoFinal){
				mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
				mapMsg.put("detalle", "ya_existe_rango_final");
				return mapMsg;
			}
			
			boolean isValid = promocionBonoDao.validarConsumoIniRangoFinal(vaConsumoInicio,idPromocionBono);
			if(!isValid){
				mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
				mapMsg.put("detalle", "existen_rangos_mayores");
				return mapMsg;
			}			
		}else{
			//validaciones en el caso de los demas rangos
			
			boolean isValid = promocionBonoDao.validarNoMayorARangoFinal(vaConsumoInicio,vaConsumoFin,idPromocionBono);
			if(!isValid){
				mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
				mapMsg.put("detalle", "rango_final_debe_ser_mayor");
				return mapMsg;
			}
		}
		
		/****************************************************/
		
		boolean isValid = promocionBonoDao.validarRegistroConsecutivo(vaConsumoInicio, 
		vaConsumoFin, idPromocionBono, stEsRangoFinal);
		
		if(!isValid){
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			mapMsg.put("detalle", "no_es_registro_consecutivo");
			return mapMsg;
		}
		
		/****************************************************/
		
		return promocionBonoDao.guardarRangos(idPromocionBono, vaConsumoInicio, 
		vaConsumoFin, vaCantidad, stEsRangoFinal);
	}

	public Map<String, Object> validarRegistroRangoFinal(
			String idPromocionBono) {

		Map<String, Object> mapMsg = new HashMap<String, Object>();
		boolean existeRangoFinal = promocionBonoDao.existeRangoFinal(idPromocionBono);
		if(!existeRangoFinal){
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			mapMsg.put("detalle", "no_existe_rango_final");
		}else{
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.SUCCESS);
		}
		
		return mapMsg;
	}

	public boolean verificarSiTieneRangos(Long idPromocionBono) {
		return promocionBonoDao.verificarSiTieneRangos(idPromocionBono);
	}

	public boolean validarNoUsanPromocionBono(Long id) {
		return promocionBonoDao.validarNoUsanPromocionBono(id);
	}

	public List<ClpbPromocionBono> listarPromocionesBonoVigentes(boolean addItemDefault) {
		return promocionBonoDao.listarPromocionesBonoVigentes(addItemDefault);
	}

	public int eliminarRangoEnAdelante(String idRangoPromocion,
			String idPromocionBono) {
		return promocionBonoDao.eliminarRangoEnAdelante(idRangoPromocion,idPromocionBono);
	}

	public Map<String, Object> verificarSiEsRangoIntermedio(
			String idRangoPromocion, String idPromocionBono) {
		return promocionBonoDao.verificarSiEsRangoIntermedio(idRangoPromocion,idPromocionBono);
	}

	public Map<String, Object> verificarPromocionEstaVigente(Long idPromocionBono) {
		return promocionBonoDao.verificarPromocionEstaVigente(idPromocionBono);
	}
	
	
	
	public BNPromocionBono obtenerBNPromocionBono(Long idPromocionBono){
		return promocionBonoDao.obtenerBNPromocionBono(idPromocionBono);
		
	}
	

	
	public List<BNPromocionEstacion> listadoPromocionBono(Long idPromocionBono){
		
		List<BNPromocionEstacion> listafinal=null;
		List<BNPromocionEstacion> listaEstacion=null;
		BNPromocionEstacion bean=new BNPromocionEstacion();
		String numero="";
		String ids = "";
		
		listafinal=promocionBonoDao.listadoBNPromocionBono(idPromocionBono);
		
		if(!listafinal.isEmpty()){

			for(int i=0; i<listafinal.size(); i++){
				bean=listafinal.get(i);
				numero=bean.getCoEstacion()+"";
				
				ids = ids.concat(numero.concat(CLPConstantes.CARACTER_COMA));
			}			
		}

		if(ids.endsWith(CLPConstantes.CARACTER_COMA)){
			ids = ids.substring(0, ids.length() - 1);
		}

		listaEstacion=promocionBonoDao.listadoBNEstacion(ids);
		
		listafinal.addAll(listaEstacion);
		
		
		return listafinal;
	}

	@Override
	public Map<String, Object> guardarPromocionBonoEstacion(
			BNPromocionBono bnPromocionBono) {
		ArrayList<String> queries= new ArrayList<String>();
		String resu="";
		String update="";
		String insert="";
		Map<String, Object> mapMsg = new HashMap<String, Object>();
		ClprPromocionEstacion promocionEstacion= new ClprPromocionEstacion();
		
		promocionEstacion.getClpbPromocionBono().setId(new Long(bnPromocionBono.getCoPromocionBono()));
		
		
		BNPromocionEstacion bean=null;
		
		for(int x=0; x<bnPromocionBono.getListaEstaciones().size(); x++){
			bean= bnPromocionBono.getListaEstaciones().get(x);
		
			if(bean.getId()!=null ){
		
				promocionEstacion.setId(bean.getId());
				promocionEstacion.getClpbEstacion().setId(bean.getCoEstacion());
				promocionEstacion.setStPromocionEstacion(bean.isEstacionBool());
				update=promocionBonoDao.getUpdate(promocionEstacion);
				queries.add(update);
				
			}else if(bean.getId()==null && bean.isEstacionBool()!= false){
			
				promocionEstacion.getClpbEstacion().setId(bean.getId());
				promocionEstacion.getClpbEstacion().setId(bean.getCoEstacion());
				insert=promocionBonoDao.getInsert(promocionEstacion);
				queries.add(insert);
			}
			
	
			
		}
		if(!queries.isEmpty()&& queries!=null){
			resu=promocionBonoDao.guardarPromocionBonoEstacion(queries);
			if(resu.equalsIgnoreCase(CLPConstantes.SUCCESS)){
			
				mapMsg.put(CLPConstantes.MSG, CLPConstantes.SUCCESS);
			}else{
				
				mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			}
			
		}else if(queries.isEmpty()|| queries==null){
			if(resu.equalsIgnoreCase("")){
				
			 mapMsg.put(CLPConstantes.MSG, CLPConstantes.ESPACIO_VACIO);
			
			}
		}
	
		return mapMsg;
	}
	
}
